bindings: Parse into GVariantBuilder directly
authorBenjamin Otte <otte@redhat.com>
Tue, 31 Jul 2018 19:34:52 +0000 (21:34 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 26 Mar 2020 02:36:03 +0000 (22:36 -0400)
Avoids the indirection via GtkBindingArg

gtk/gtkbindings.c

index d54c8d1724f55ebf12d0f3b538c8d4292fccec59..1f2937035e5d6b0da16d1ea04983eb3f4817dfa5 100644 (file)
@@ -1216,24 +1216,20 @@ gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
                               guint           n_args,
                               ...)
 {
-  GSList *slist, *free_slist;
+  GVariantBuilder builder;
   va_list args;
+  GType arg_type;
   guint i;
 
   g_return_if_fail (binding_set != NULL);
   g_return_if_fail (signal_name != NULL);
 
   va_start (args, n_args);
-  slist = NULL;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
   for (i = 0; i < n_args; i++)
     {
-      GtkBindingArg *arg;
-
-      arg = g_slice_new0 (GtkBindingArg);
-      slist = g_slist_prepend (slist, arg);
-
-      arg->arg_type = va_arg (args, GType);
-      switch (G_TYPE_FUNDAMENTAL (arg->arg_type))
+      arg_type = va_arg (args, GType);
+      switch (G_TYPE_FUNDAMENTAL (arg_type))
         {
         case G_TYPE_CHAR:
         case G_TYPE_UCHAR:
@@ -1242,33 +1238,35 @@ gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
         case G_TYPE_BOOLEAN:
         case G_TYPE_ENUM:
         case G_TYPE_FLAGS:
-          arg->arg_type = G_TYPE_LONG;
-          arg->d.long_data = va_arg (args, gint);
+          g_variant_builder_add (&builder, "x", (gint64) va_arg (args, gint));
           break;
         case G_TYPE_LONG:
         case G_TYPE_ULONG:
-          arg->arg_type = G_TYPE_LONG;
-          arg->d.long_data = va_arg (args, glong);
+          g_variant_builder_add (&builder, "x", (gint64) va_arg (args, glong));
           break;
         case G_TYPE_FLOAT:
         case G_TYPE_DOUBLE:
-          arg->arg_type = G_TYPE_DOUBLE;
-          arg->d.double_data = va_arg (args, gdouble);
+          g_variant_builder_add (&builder, "d", (gint64) va_arg (args, gdouble));
           break;
         case G_TYPE_STRING:
-          arg->arg_type = G_TYPE_STRING;
-          arg->d.string_data = va_arg (args, gchar*);
-          if (!arg->d.string_data)
-            {
-              g_warning ("gtk_binding_entry_add_signal(): type '%s' arg[%u] is 'NULL'",
-                         g_type_name (arg->arg_type),
-                         i);
-              i += n_args + 1;
+          {
+            char *s = va_arg (args, gchar*);
+            if (s != NULL)
+              {
+                g_variant_builder_add (&builder, "s", s);
+              }
+            else
+              {
+                g_warning ("gtk_binding_entry_add_signal(): type '%s' arg[%u] is 'NULL'",
+                           g_type_name (arg_type),
+                           i);
+                i += n_args + 1;
+              }
             }
           break;
         default:
           g_warning ("gtk_binding_entry_add_signal(): unsupported type '%s' for arg[%u]",
-                     g_type_name (arg->arg_type), i);
+                     g_type_name (arg_type), i);
           i += n_args + 1;
           break;
         }
@@ -1276,18 +1274,9 @@ gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
   va_end (args);
 
   if (i == n_args || i == 0)
-    {
-      slist = g_slist_reverse (slist);
-      gtk_binding_entry_add_signall (binding_set, keyval, modifiers, signal_name, slist);
-    }
-
-  free_slist = slist;
-  while (slist)
-    {
-      g_slice_free (GtkBindingArg, slist->data);
-      slist = slist->next;
-    }
-  g_slist_free (free_slist);
+    gtk_binding_entry_add_signal_variant (binding_set, keyval, modifiers, signal_name, g_variant_builder_end (&builder));
+  else
+    g_variant_builder_clear (&builder);
 }
 
 /**